home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmigcc5.zip / RSX / SOURCE / FPU-EMU / CRT0FPUW.S < prev    next >
Text File  |  1994-05-27  |  2KB  |  117 lines

  1. /* copro struct */
  2.  
  3. #define i_orgeip    _info
  4. #define i_retsys    _info+4
  5. #define i_ebx        _info+8
  6. #define i_ecx        _info+12
  7. #define i_edx        _info+16
  8. #define i_esi        _info+20
  9. #define i_edi        _info+24
  10. #define i_ebp        _info+28
  11. #define i_eax        _info+32
  12. #define i_ds        _info+36
  13. #define i_es        _info+40
  14. #define i_fs        _info+44
  15. #define i_gs        _info+48
  16. #define i_orgeax    _info+52
  17. #define i_eip        _info+56
  18. #define i_cs        _info+60
  19. #define i_eflags    _info+64
  20. #define i_esp        _info+68
  21. #define i_ss        _info+72
  22.  
  23.  
  24.     .globl start
  25.     .globl _back_to_prg
  26.     .globl _debugged
  27.     .globl _used_math
  28.     .globl _raise
  29.  
  30.     .text
  31.  
  32. /* called from extender: 1. init exception ; 2. change mathe state */
  33. /* gs = emu data seg */
  34.  
  35. start:
  36.     cmpl    $0x98765432,%eax    /* exception call ? */
  37.     jz    L11
  38.     cmpl    $0x12345678,%eax    /* init call ? */
  39.     jz    L10
  40.     movl    %edx, %gs:_debugged    /* debugged>0 : don't lookahead */
  41.     movl    %ecx, %gs:_used_math    /* used_math>0: don't init */
  42.     lret
  43. /* ! can't use movl %eax,gs:xx (bug ??) */
  44.  
  45.  
  46.     .align 2,144
  47. L10:
  48.     movl    $_info , %eax           /* return coprostruct */
  49.     lret
  50.  
  51.  
  52.     .align 2,144
  53. /* entry : gs = emu sel , ds:esi = info stuct */
  54. L11:
  55.     movw    %gs, %dx
  56.  
  57.     movw    %dx, %ds
  58.     movw    %dx, %es
  59.     movw    %dx, %ss
  60.     movl    emu_esp, %esp
  61.  
  62.     movw    i_fs,%fs
  63.  
  64.     pushl    $_info
  65.     call    _math_emulate
  66. _back_to_prg:
  67.     movl    i_eax,%eax
  68.     movl    i_ebx,%ebx
  69.     movl    i_ecx,%ecx
  70.     movl    i_edx,%edx
  71.     movl    i_esi,%esi
  72.     movl    i_edi,%edi
  73.     movl    i_ebp,%ebp
  74.     movw    i_es,%es
  75.     movw    i_fs,%fs
  76.  
  77.     movw    i_ss,%ss    /* change stack to user */
  78.     movl    i_esp,%esp
  79.  
  80.     pushl    i_eflags
  81.     pushl    i_cs
  82.     pushl    i_eip
  83.     movw    i_ds,%ds
  84.     iret
  85.  
  86.  
  87.     .align 2,144
  88. _abort_emu:
  89. _raise:
  90.     movw $0xFFFF,%eax
  91.     lret
  92.  
  93.  
  94.     .data
  95.  
  96.     rsxfpu_ver:
  97.         .long 103
  98.  
  99.     dpmi_esp:
  100.         .long 0
  101.     dpmi_ss:
  102.         .long 0
  103.     emu_esp:
  104.         .long 0xfff0
  105.     _debugged:
  106.         .long 0
  107.     _used_math:
  108.         .long 0
  109.  
  110.         .globl _process_npx
  111.     _process_npx:
  112.         .long _copro
  113.  
  114.     .comm _copro,172
  115.     .comm _info,92
  116.  
  117.